import math


class Match:
    def add(self, x, y):
        return x + y


# 封装的Math类中的实例方法改为静态方法, 体会一下两者的区别
# 实例方法：第一个参数必须是实例对象，该参数名一般约定为“self”，只能由实例对象调用
# 静态方法：使用装饰器@staticmethod。参数随意，但是方法体中不能使用类或实例的任何属性和方法，实例对象和类对象都可以调用
class MyMatch:
    # 加法
    @staticmethod
    def add(x, y):
        return x + y

    # 减法
    @staticmethod
    def reduce(x, y):
        return x - y

    # 乘法
    @staticmethod
    def mul(x, y):
        return x * y

    # 乘方
    @staticmethod
    def power(x, y):
        return x ** y

    # 除法
    @staticmethod
    def division(x, y):
        if y == 0:
            return False
        return x / y

    # 整除
    @staticmethod
    def divisible(x, y):
        if y == 0:
            return False
        return x // y

    # 取余
    @staticmethod
    def surplus(x, y):
        if y == 0:
            return False
        return x % y

    # 开方
    @staticmethod
    def evolution(x):
        return math.sqrt(x)


"""
身边的事物抽象出一个类, 在此基础上添加以下功能:
在类中创建类属性
在类中创建私有属性
在__init__中初始化实例属性
在__init__中初始化实例私有属性
通过类方法来获取类的私有属性
在自己的类中实现__str__
"""


class Dog(object):
    dog_desc = "狗子是人类忠诚的朋友"
    __color = '狗哥是黑色的'

    def __init__(self, name, age):
        self.name = name
        self.__age = age

    def run(self):
        return f'{self.name} 的能跑'

    def attr(self):
        return f'{self.name} 的特性'

    # 通过类方法来获取类的私有属性
    @classmethod
    def get_color(clx):
        return clx.__color

    def get_age(self):
        return f'{self.name} 今年芳龄 {self.__age}'

    # 实现__str__
    def __str__(self):
        return f"{self.name} 的特征类别"


if __name__ == '__main__':
    match = Match()
    print(match.add(1, 2))
    print(MyMatch.add(1, 2))  # 可以直接调用的函数, 不需要实例化

    dog = Dog('狗子', 28)
    print(dog)
    print(dog.dog_desc)
    print(dog.get_color())
    print(dog.get_age())
